/**
 * @author Michel OLIVIER
 * @version 1.1
 * @description AndroDot permet de publier un article sur un blog DotClear 1 et 2
 * Via les APIs XML-RPC
 * Implémente la méthode metaWeblog.newPost
 * Description : Création d'un nouveau billet.
 * Paramètres : String blogid, String username, String password, struct content, boolean publish.
 * Retourne : En cas de succès, String postid, l'id du nouveau billet ; en cas d'erreur, une erreur XML/RPC.
 * Note : Le struct content peut contenir les valeurs courantes suivantes :
   - title pour le titre du billet ;
   - description pour le contenu du billet ;
   - mt_allow_comments pour indiquer si les commentaires sont permis ou non ;
   - mt_allow_pings pour indiquer si les trackbacks sont permis ou non ;
   - mt_excerpt pour le chapo du billet.
   @todo stockage hors ligne
 */
package com.androdot;

import java.util.HashMap;
import java.util.Map;
import org.xmlrpc.android.XMLRPCClient;
import org.xmlrpc.android.XMLRPCException;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class Androdot extends Activity {
	private static String utilisateur = "";
	private static String mdp = "";
	private static String urlBlog = "";
	private static String nbPost = "";
	private static Boolean estPublier = false;
	private static Boolean estCommentaires = false;
	private static Boolean estRetroLiens = false;
	private static Boolean enModification = false;
	// private static final String idBlog = "1";
	// private static final String ARKALOG = "ARKALOG";
	private static final int CODE_RETOUR = 1;
	// Composants de l'activity
	private EditText article;

	/*
	 * Méthode pour créer un "Option Menu" lors d'une pression sur le bouton menu
	 */
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.main_menu, menu);
		return true;
	}

	/*
	 * Méthode pour éxécuter une action sur séléction d'un "item" de Option Menu
	 */
	public boolean onOptionsItemSelected(MenuItem item) {

		switch (item.getItemId()) {
		case R.id.pageNew:
			// lance l'activité main
			startActivity(new Intent(this, Androdot.class));
			return true;

		case R.id.pageConfiguration:
			// Lance l'Activity de Preference
			startActivityForResult(new Intent(this, Configuration.class),
					CODE_RETOUR);
			return true;

		case R.id.pageAPropos:
			startActivity(new Intent(this, Apropos.class));
			return true;

		case R.id.pageRecentPost:
			startActivity(new Intent(this, RecentPosts.class));
			return true;

		default:
			break;
		}
		return false;
	}
	/**
	 * Methodes pour le BB CODE
	 * @param v
	 */
	public void bbcode(String bbcode) {
		article = (EditText) findViewById(R.id.article);
		article.setText(article.getText() + bbcode);
	}
	
	public void citation(View v){
		bbcode("@@ @@");
	}
	
	public void rayer(View v){
		bbcode("-- --");
	}
	
	public void souligner(View v){
		bbcode("++ ++");
	}
	
	public void gras(View v){
		bbcode("__ __");
	}
	
	public void italique(View v){
		bbcode("\" \"");
	}
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Affiche la vue principale issue de res/layout/main
		setContentView(R.layout.main);

		// Chargement des préférences avec l'Activity "Preference"
		SharedPreferences preferences = PreferenceManager
				.getDefaultSharedPreferences(this);
		utilisateur = preferences.getString("utilisateur", "");
		urlBlog = preferences.getString("urlBlog", "");
		mdp = preferences.getString("mdp", "");
		nbPost = preferences.getString("nbRecentPosts", "");

		// Récupération des élément décrit dans la vue "main"
		final EditText chapo = (EditText) findViewById(R.id.chapo);
		final EditText article = (EditText) findViewById(R.id.article);
		final EditText titre = (EditText) findViewById(R.id.titre);
		final Button envoyer = (Button) findViewById(R.id.envoyer);
		
		final CheckBox publier = (CheckBox) findViewById(R.id.publier);
		final CheckBox commentaires = (CheckBox) findViewById(R.id.commentaires);
		final CheckBox retroLiens = (CheckBox) findViewById(R.id.retroLiens);

		// Test si on est en MODIFICATION
		final Bundle extras = this.getIntent().getExtras();
		if (extras != null) {
			enModification = true;
			
			Toast.makeText(getBaseContext(), "Modification", Toast.LENGTH_LONG).show();
			titre.setText(extras.getString("titre"));
			chapo.setText(extras.getString("mt_excerpt"));
			article.setText(extras.getString("description"));
			//Log.i("ARKA", extras.getString("mt_allow_comments"));
			if(extras.getString("mt_allow_comments").equals("1")){
				commentaires.setChecked(true);			
			} else {
				commentaires.setChecked(false);
			}
			if(extras.getString("mt_allow_pings").equals("1")){
				retroLiens.setChecked(true);			
			} else {
				retroLiens.setChecked(false);
			}
			
		}
		
		// Action du bouton "envoyer"
		envoyer.setOnClickListener(new Button.OnClickListener() {

			public void onClick(View v) {

				if ("".equals(titre.getText().toString())
						|| "".equals(article.getText().toString())) {
					Toast.makeText(getBaseContext(),
							"Veuillez remplir l'article et son titre!",
							Toast.LENGTH_SHORT).show();
					return;
				} else {
					// Verifie si la publication, les commentaires et les retro
					// liens sont cheked
					if (publier.isChecked()) {
						estPublier = true;
					}
					if (commentaires.isChecked()) {
						estCommentaires = true;
					}
					if (retroLiens.isChecked()) {
						estRetroLiens = true;
					}

					String messageReponse = "";

					// Client XML RPC avec URL du blog
					XMLRPCClient client = new XMLRPCClient(urlBlog);

					try {
						// map = type struct voir la doc XMLRPCClient
						Map<String, Object> struct = new HashMap<String, Object>();
						struct.put("title", titre.getText().toString());
						struct.put("description", article.getText().toString());
						struct.put("mt_allow_comments", estCommentaires);
						struct.put("mt_allow_pings", estRetroLiens);
						struct.put("mt_excerpt", chapo.getText().toString());

						/*
						 * Si les Extra Parametres sont présent c'est une modif
						 */
						if (enModification) {
							/**s
							 *
							 * metaWeblog.editPost
							 * 
							 * Description : Met à jour les informations d'un
							 * billet donné.
							 * 
							 * Paramètres : String postid, String username,
							 * String password, struct content, boolean publish.
							 * 
							 * Retourne : En cas de succès, valeur booléenne
							 * vraie, sinon une erreur XML/RPC.
							 * 
							 * Note : Le struct content peut contenir les
							 * valeurs courantes suivantes :
							 * 
							 * 
							 * title pour le titre du billet ;
							 * 
							 * description pour le contenu du billet ;
							 * 
							 * dateCreated pour la date du billet ;
							 * 
							 * mt_allow_comments pour indiquer si les
							 * commentaires sont permis ou non ;
							 * 
							 * mt_allow_pings pour indiquer si les trackbacks
							 * sont permis ou non ;
							 * 
							 * mt_excerpt pour le chapo du billet.
							 */
							client.call(
									"metaWeblog.editPost", extras.getString("postid"), utilisateur,
									mdp, struct, estPublier);
							messageReponse += "Votre article à bien été modifié.";
							finish();
						} else {
							/**
							 * metaWeblog.newPost
							 * 
							 * Description : Création d'un nouveau billet.
							 * 
							 * Paramètres : String blogid, String username,
							 * String password, struct content, boolean publish.
							 * 
							 * Retourne : En cas de succès, String postid, l'id
							 * du nouveau billet ; en cas d'erreur, une erreur
							 * XML/RPC.
							 * 
							 * Note : Le struct content peut contenir les
							 * valeurs courantes suivantes :
							 * 
							 * 
							 * title pour le titre du billet ;
							 * 
							 * description pour le contenu du billet ;
							 * 
							 * mt_allow_comments pour indiquer si les
							 * commentaires sont permis ou non ;
							 * 
							 * mt_allow_pings pour indiquer si les trackbacks
							 * sont permis ou non ;
							 * 
							 * mt_excerpt pour le chapo du billet.
							 */
							String numeroPost = (String) client.call(
									"metaWeblog.newPost", "1", utilisateur,
									mdp, struct, estPublier);
							messageReponse += "Message envoyé: "
									+ (String) numeroPost;
						}

					} catch (XMLRPCException e) {
						Log.i("arka", e.getMessage());
						messageReponse += "Message non envoyé: "
								+ e.getMessage();
					}
					// On avertit de l'envois
					Toast.makeText(getBaseContext(), messageReponse,
							Toast.LENGTH_SHORT).show();
					// clean composants
					article.setText("");
					titre.setText("");
					chapo.setText("");
				}
			}
		});
	}
}